package palomino.svr;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Hashtable;

public class SAPDatosUsuarioHTTP implements java.io.Serializable

{

	Connection conexionORA = null;

	private String usuarioSAP = "NA";

	private String claveSAP = "NA";

	private String usuarioORA = "NA";

	private String claveORA = "NA";

	private String sCadenaConexionORA = "NA";

	private String ipOrigen = "0.0.0.0";

	private Hashtable htResulset = new Hashtable();

	private Hashtable htStatement = new Hashtable();

	private Hashtable htPackage = new Hashtable();

	private boolean bProcesoDesconexion = false;

	private int ejecuciones = 0;

	private long horaInicio = 0;

	private long ultimoAcceso = 0;

	private long ultimoBloqueo = 0;

	private boolean bHayConexionORA = false;

	private String sSesion = "0";

	private boolean bTrazar = false;

	private long iTimeOut = 0;

	public CallableStatement callableStatement = null;

	public PreparedStatement preparedStatement = null;

	public SAPDatosUsuarioHTTP(String psSesion, String[] pasDatosUsuario)

	{

		this(pasDatosUsuario[0], pasDatosUsuario[1],
				System.currentTimeMillis(), "");

		sSesion = psSesion;

		setDatosORA(pasDatosUsuario[2], pasDatosUsuario[3], pasDatosUsuario[4]);

	}

	public SAPDatosUsuarioHTTP(String pUsuarioSAP, String pClaveSAP,
			long pHorainicio, String pIpOrigen)

	{

		this.usuarioSAP = pUsuarioSAP;

		this.claveSAP = pClaveSAP;

		this.horaInicio = pHorainicio;

		this.ultimoAcceso = this.horaInicio;

		this.ipOrigen = pIpOrigen;

	}

	public long getTimeOut()

	{

		return iTimeOut;

	}

	public void setTimeOut(long piTimeOut)

	{

		iTimeOut = piTimeOut;

	}

	public void inicializaDatos()

	{

		htPackage.clear();

		ejecuciones = 0;

		horaInicio = 0;

		ultimoBloqueo = 0;

		htResulset.clear();

		htStatement.clear();

		conexionORA = null;

		bHayConexionORA = false;

	}

	public void desconexionORA() throws java.rmi.RemoteException

	{

		desconexionORA("false");

	}

	public void desconexionORA(String psShutDownHook)
			throws java.rmi.RemoteException

	{

		try

		{

			if (callableStatement != null)
				callableStatement.cancel();

			if (preparedStatement != null)
				preparedStatement.cancel();

		}

		catch (Exception e) {
		}

		try

		{

			if (conexionORA != null)

			{

				if (psShutDownHook.equals("true"))
					conexionORA.rollback();

				conexionORA.close();

				conexionORA = null;

				bHayConexionORA = false;

			}

		}

		catch (Exception exception)

		{

			String res = exception.getMessage();

			// Traza.error(res, sSesion);

			throw new java.rmi.RemoteException(res, exception);

		}

	}

	public Connection getConexionORA() throws java.rmi.RemoteException

	{

		if (conexionORA == null)

		{

			try

			{

				Class.forName(TLGenerador.DRIVERORACLE);

				conexionORA = DriverManager.getConnection(TLGenerador.URLCONEXION
						+ sCadenaConexionORA, usuarioORA, claveORA);

				conexionORA.setAutoCommit(false);

				bHayConexionORA = true;

			}

			catch (Exception exception)

			{

				String res = exception.getMessage();

				//Traza.error(res, sSesion);

				throw new java.rmi.RemoteException(res, exception);

			}

		}

		return conexionORA;

	}

	public void setConexionORA(Connection pConexionORA)

	{

		conexionORA = pConexionORA;

		bHayConexionORA = true;

	}

	public boolean isConectado()

	{

		return bHayConexionORA;

	}

	public void setSAPDatosUsuarioHTTP(String pUsuarioSAP, String pClaveSAP,
			long pHorainicio, String pIpOrigen)

	{

		this.usuarioSAP = pUsuarioSAP;

		this.claveSAP = pClaveSAP;

		this.horaInicio = pHorainicio;

		this.ultimoAcceso = this.horaInicio;

		this.ipOrigen = pIpOrigen;

	}

	public void setDatosORA(String psUsuarioORA, String psClaveOra,
			String psCadenaConexion)

	{

		this.usuarioORA = psUsuarioORA;

		this.claveORA = psClaveOra;

		this.sCadenaConexionORA = psCadenaConexion;

	}

	public void setDatosPackage(String cual, DatosPackageHTTP pDatosPackage)

	{

		htPackage.remove(cual);

		htPackage.put(cual, pDatosPackage);

	}

	public DatosPackageHTTP getDatosPackage(String cual)

	{

		return (DatosPackageHTTP) htPackage.get(cual);

	}

	public void sumaEjecuciones()

	{

		ejecuciones++;

		this.ultimoAcceso = System.currentTimeMillis();

	}

	public void setUltimoAcceso(long pUltimoAcceso)

	{

		this.ultimoAcceso = pUltimoAcceso;

	}

	public void setProcesoDesconexion(boolean pbProcesoDesconexion)

	{

		bProcesoDesconexion = pbProcesoDesconexion;

		if (bProcesoDesconexion)

		{

			ultimoBloqueo = System.currentTimeMillis();

		}

		else

		{

			ultimoBloqueo = 0;

		}

	}

	public int getBloqueo()

	{

		if (!bProcesoDesconexion)
			return 0;

		return Math.max(
				(int) (System.currentTimeMillis() - ultimoBloqueo) / 1000, 0);

	}

	public String getUsuarioSAP()

	{

		return this.usuarioSAP;

	}

	public String getClaveSAP()

	{

		return this.claveSAP;

	}

	public String getIp()

	{

		return this.ipOrigen;

	}

	public String getUsuarioORA()

	{

		return this.usuarioORA;

	}

	public String getClaveORA()

	{

		return this.claveORA;

	}

	public String getCadenaConexionORA()

	{

		return this.sCadenaConexionORA;

	}

	public int getEjecuciones()

	{

		return this.ejecuciones;

	}

	public void cierraDatos(String psSesion, String cual)
			throws java.rmi.RemoteException

	{

		try

		{

			if (htResulset.containsKey(cual))

			{

				ResultSet lResultSet = (ResultSet) htResulset.get(cual);

				if (lResultSet != null)
					lResultSet.close();

				htResulset.remove(cual);

			}

			if (htStatement.containsKey(cual))

			{

				PreparedStatement lSentencia = (PreparedStatement) htStatement
						.get(cual);

				if (lSentencia != null)
					lSentencia.close();

				htStatement.remove(cual);

			}

		}

		catch (java.sql.SQLException e)

		{

			// Traza.error("Error al cerrar cursor.", psSesion);

			throw new java.rmi.RemoteException("Error al cerrar cursor.", e);

		}

	}

	public void setDatos(String cual, ResultSet rSet,
			PreparedStatement pSentencia)

	{

		if (htResulset.containsKey(cual))

			htResulset.remove(cual);

		if (htStatement.containsKey(cual))

			htStatement.remove(cual);

		htResulset.put(cual, rSet);

		htStatement.put(cual, pSentencia);

	}

	public ResultSet getDatos(String cual)

	{

		return (ResultSet) htResulset.get(cual);

	}

	public PreparedStatement getSentencia(String cual)

	{

		return (PreparedStatement) htStatement.get(cual);

	}

	public long getHoraInicio()

	{

		if (horaInicio == 0)

			horaInicio = System.currentTimeMillis();

		return this.horaInicio;

	}

	public long getUltimoAcceso()

	{

		return this.ultimoAcceso;

	}

	public void setTrazar(boolean pbTrazar)

	{

		bTrazar = pbTrazar;

	}

	public boolean isTrazar()

	{

		return bTrazar;

	}

}
